package br.jcrsistemas.componentes;

import java.text.ParseException;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JOptionPane;

import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;
import org.brazilutils.br.cpfcnpj.Cpf;
import org.brazilutils.validation.ValidationException;

public class SysCPF extends SysMaskTextField {

    private MaskFormatter formatador;
    private boolean validarNaSaida;

    /**
     * @throws ParseException 
     * 
     */
    public SysCPF() throws ParseException {
        super();
        setValidarNaSaida(true);
        formatador = new MaskFormatter("###.###.###-##");
        formatador.setPlaceholderCharacter((mostraUnderline ? '_' : ' '));
        setFormatterFactory(new CPFFormatter());
        setInputVerifier(new InputVerifier() {

            @Override
            public boolean verify(JComponent input) {
                SysCPF componente = (SysCPF) input;
                if (componente.isObrigatorio()) {
                    if (componente.getConteudoValidado().equals("")) {
                        JOptionPane.showMessageDialog(input.getParent(), "Campo obrigatório", "Aviso!", JOptionPane.INFORMATION_MESSAGE);
                        return false;
                    }
                }

                if (componente.isValidarNaSaida() && !componente.getCPFSemFormatacao().trim().isEmpty()) {
                    try {
                        Cpf cpf = new Cpf(componente.getCPFSemFormatacao());
                        if (!cpf.isValid()) {
                            JOptionPane.showMessageDialog(input.getParent(), "CPF " + componente.getCPFSemFormatacao() + " inválido!", "Aviso!", JOptionPane.ERROR_MESSAGE);
                            return false;
                        }

                    } catch (ValidationException e) {
                        JOptionPane.showMessageDialog(null, e.getMessage());
                        componente.selectAll();
                        return false;
                    }

                }
                return true;

            }
        });


    }

    public String getConteudoValidado() {
        return getText().equals("   .   .   -  ") ? "" : getText();
    }

    public String getCPFSemFormatacao() {
        return getText().replace(".", "").replace("-", "");
    }

    public void setValidarNaSaida(boolean validarNaSaida) {
        this.validarNaSaida = validarNaSaida;
    }

    public boolean isValidarNaSaida() {
        return validarNaSaida;
    }

    private class CPFFormatter extends DefaultFormatterFactory {

        /**
         * @throws ParseException 
         * 
         */
        public CPFFormatter() throws ParseException {
            super(formatador);

        }
    }
}
